xxxxxxxxxx fullPath: string, }​ interface Entry { li: HTMLLIElement; name: string; fullPath: string;​ children: Entry[]; }​ function findEntry( fullPath: string, path: string, entries: Entry[], createIfAbsent: boolean): Entry { var name: string, restPath: string;​ var slashPos = path.indexOf('/'); while (!slashPos) { // slight normalization, keep it for the sake of root paths path = path.slice(1); slashPos = path.indexOf('/'); } if (slashPos < 0) { name = path; restPath = null; } else { name = path.slice(0, slashPos); restPath = path.slice(slashPos + 1); } var seekResult = _seekEntryNonRecursive(name, entries); var nextEntry: Entry; if (seekResult.insert) { if (!createIfAbsent) return null; nextEntry = _createNewEntry(fullPath, name); entries.splice(seekResult.index, 0, nextEntry); } else { nextEntry = entries[<any>seekResult]; } if (restPath) return findEntry(fullPath, restPath, nextEntry.children, createIfAbsent); else return nextEntry;​ }​ function _createNewEntry(fullPath: string, name: string): Entry { var li = document.createElement('li'); li.textContent = name; // fullPath ? // TODO: create LI, add to parent, create Entry and return }​ /** Returns either number (succeess) or complex obj (failure) */ function _seekEntryNonRecursive( name: string, entries: Entry[]): { insert: boolean; index: number } { if (entries.length==0) return null; if (entries[0].name > name) return { insert: true, index: 0 }; if (entries[0].name === name) return <any>0; var lowIndex = 0;